const Koa = require('koa')
const Router = require('koa-router')
// 这里从koa-bodyparser换做koa-body  如果项目有图片上传的需求的话 需要koa-multer 但是这个依赖与koa-route（注意不是 koa-router） 存在不兼容的问题
// 但是这两个依赖都可以使用koa-body代替  而且这个依赖与koa-bodyparser使用差不多  body都是放在 ctx.request.body
const body = require('koa-body')
// 这个依赖进行验证token进行鉴权
const koaJwt = require('koa-jwt')
// 将连接抽离成一个js文件 结构更清晰 方便设置
const secretKey = require('./config/keys').secretKey
// 导入cors解决跨域的问题
const cors = require('@koa/cors')
// 导入cors的选项
const corsOptions = require('./config/cors')
// 引入静态资源服务
const serve = require('koa-static')
const path = require('path')

require('./config/connect')

// 实例化koa
const app = new Koa()
const router = new Router()
const public = serve(path.join(__dirname, '/public'))

// 这里就是当token报错的时候进行处理 当token验证失败时就会触发这个函数  这个要放在app.use(koaJwt)之前使用
app.use(async (ctx, next) => {
  return next().catch((err) => {
    if (401 === err.status) {
      ctx.status = 401
      console.log('token验证失败')
      ctx.body = 'token 验证失败'
    } else {
      throw err
    }
  })
})

// 使用静态资源
app.use(public)  // 这里使用后 直接访问 localhost:5000/ 就会访问到public文件夹中去 就可以这样使用 localhost:5000/img/123.jpg
// 使用并且配置 koa-cors
app.use(cors(corsOptions))
// 注意这里一定要提前使用  不然不会生效 所以要使用插件 最好是在app声明后就进行使用
// 使用koa-jwt全局鉴权  这个插件也必须放在app使用路由之前
app.use(koaJwt({ secret: secretKey }).
  // 注意这里的正则表达式一定要写对 不然的话没有全局鉴权的意义
  unless({ path: [/^\/user/, /^\/goods/, /^\/carousel/] }))
// 使用koa-bodyparser  这个插件必需放在app使用路由之前
app.use(body({
  multipart: true //表示支持文件上传
}))
// 使用路由
app.use(router.routes()).use(router.allowedMethods())

// 用户页面 包括注册和登录
router.use('/user', require('./routes/user/user'))
// 商品页面
router.use('/goods', require('./routes/goods/goods'))
// 走马灯接口
router.use('/carousel', require('./routes/carousel/carousel'))
// 购物车接口
router.use('/cart', require('./routes/cart/cart'))
// 订单接口
router.use('/order', require('./routes/order/order'))

// 监听端口
const port = process.env.port || 5000
app.listen(port, () => {
  console.log(`监听${port}端口`)
})
